package org.az.netty_study.p01_nio组件之buffer;

import org.az.netty_study.ByteBufferUtil;

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 一段文本可能是多个句子组成，如何得到每个句子呢?
 *  可以用到分散读，即知道每个句子的长度，然后分别读到对应长度的buffer里
 * 如何将这些句子拼接成一段文本写入文件呢?
 *  可以用到集中写，即将多个buffer组成一个大buffer，然后将这个大buffer的数据写入文件
 *
 * 分散读和集中写，重点是思想，利用分散和聚合的思想，只读取和写入一次就能实现句子分别读取和整合写入
 */
public class _7_分散读集中写 {
    public static void main(String[] args) {
        ByteBuffer buffer1 = null;
        ByteBuffer buffer2 = null;
        ByteBuffer buffer3 = null;

        //分散读
        try (FileChannel channel = new RandomAccessFile("src\\main\\resources\\data.txt", "r").getChannel()) {
            buffer1 = ByteBuffer.allocate(6);
            buffer2 = ByteBuffer.allocate(3);
            buffer3 = ByteBuffer.allocate(3);
            //将data.txt的全部文本分别读取到三个ByteBuffer里
            channel.read(new ByteBuffer[]{buffer1, buffer2, buffer3});

            ByteBufferUtil.debugAll(buffer1);
            ByteBufferUtil.debugAll(buffer2);
            ByteBufferUtil.debugAll(buffer3);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //集中写
        buffer1.flip();
        buffer2.flip();
        buffer3.flip();
        try (FileChannel channel = new RandomAccessFile("src\\main\\resources\\data1.txt", "rw").getChannel()) {
            channel.write(new ByteBuffer[]{buffer1, buffer2, buffer3});
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
